package org.example.infrastructure.adapter.repository;

import lombok.Builder;
import org.example.domain.tag.adapter.repository.ITagRespository;
import org.example.domain.tag.model.entity.CrowdTagsJobentity;
import org.example.infrastructure.dao.ICrowdTagDao;
import org.example.infrastructure.dao.ICrowdTagsDetailDao;
import org.example.infrastructure.dao.ICrowdTagsJobDao;
import org.example.infrastructure.dao.po.CrowdTags;
import org.example.infrastructure.dao.po.CrowdTagsDetail;
import org.example.infrastructure.dao.po.CrowdTagsJob;
import org.example.infrastructure.redis.IRedisService;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.DuplicateFormatFlagsException;
import java.util.List;
@Builder
@Repository
public class TagRepository implements ITagRespository {

@Resource
    private ICrowdTagDao crowdTagDao;
    @Resource
    private ICrowdTagsDetailDao crowdTagsDetailDao;
    @Resource
    private ICrowdTagsJobDao crowdTagsJobDao;
    @Resource
    private IRedisService redisService;
    @Override
    public CrowdTagsJobentity queryCrowdTagsJobentity(String tagId, String batchId) {
       CrowdTagsJob crowdTagsJobReq=new CrowdTagsJob();
       crowdTagsJobReq.setTagId(tagId);
       crowdTagsJobReq.setBatchId(batchId);

        CrowdTagsJob crowdTagsJobRes = crowdTagsJobDao.queryCrowdTagsJob(crowdTagsJobReq);

       return CrowdTagsJobentity.builder()
                .tagType(crowdTagsJobRes.getTagType())
                .tagRule(crowdTagsJobRes.getTagRule())
                .statStartTime(crowdTagsJobRes.getStatStartTime())
                .statEndTime(crowdTagsJobRes.getStatEndTime())
                .build();


    }

    @Override
    public void addCrowdTagsUserId(String tagId, String userId) {

        CrowdTagsDetail crowdTagsDetail = new CrowdTagsDetail();
        crowdTagsDetail.setTagId(tagId);
        crowdTagsDetail.setUserId(userId);
        try {
            crowdTagsDetailDao.addCrowdTagsUserId(crowdTagsDetail);
            RBitSet bitSet = redisService.getBitSet(tagId);

            bitSet.set(redisService.getIndexFromUserId(userId));

        } catch (DuplicateKeyException ignore) {

        }
    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int size) {

        CrowdTags crowdTagsReq=new CrowdTags();
        crowdTagsReq.setTagId(tagId);
        crowdTagsReq.setStatistics(size);
        crowdTagDao.updateCrowdTagsStatistics(crowdTagsReq);

    }
}
